﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Memento
{
    //发起人类
    class Originator
    {
        //需要保存的属性
        private string label;
        private int x, y;

        public string Label { get => label; set => label = value; }
        public int X { get => x; set => x = value; }
        public int Y { get => y; set => y = value; }
        //创建一个备忘录，并将返回的对象保存在Caretaker中
        public Memento createMemento()
        {
            return (new Memento(label, x, y));
        }
        //恢复备忘录，将悔棋后相关的象棋信息导入并将相关数据恢复
        public void setMemento(Memento memento)
        {
            label = memento.Label;
            x = memento.X;
            y = memento.Y;
        }
        //显示悔棋的信息
        public void Show()
        {
            Console.WriteLine("后退一步！" + label + "回到原坐标：（" + x + "," + y + ")");
        }
    }
    //备忘录，用来设置象棋的信息
    class Memento
    {
        private string label;//定义了象棋的属性
        private int x, y;//定义了象棋所在位置的坐标
        public string Label
        {
            get { return label; }
        }
        public int X
        {
            get { return x; }
        }
        public int Y
        {
            get { return y; }
        }
        //构造方法，设置相关的属性
        public Memento(string lb,int x,int y)
        {
            label = lb;
            this.x = x;
            this.y = y;
        }
    }
    //管理者类，保存备忘录
    class Caretaker
    {
        private Memento memento;//新建一个备忘录对象，将信息保存在这个对象中
        public Memento Memento
        {
            get { return memento; }
            set { memento = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //发起人类的初始化状态，设置象棋上一步是红方的炮所在坐标为（12,10）
            Originator chess = new Originator();
            chess.Label = "红方的炮";
            chess.X = 12;
            chess.Y = 10;
            //定义管理者类的对象，保存定义的象棋的状态
            Caretaker c = new Caretaker();
            c.Memento = chess.createMemento();
            //现在改变象棋的属性，下一步是绿方的马走到所在坐标为（15，20）的位置
            chess.Label = "绿方的马";
            chess.X = 15;
            chess.Y = 20;
            //执行悔棋操作，调取刚才保存的备忘录，恢复到上一步的棋盘状态
            chess.setMemento(c.Memento);
            chess.Show();
            Console.Read();
        }
    }
}
